热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

都会|患者_Swift两种方式实现async/await并发模型中任务超时(timeout)的取消

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Swift两种方式实现async/await并发模型中任务超时(timeout)的取消相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了Swift 两种方式实现 async/await 并发模型中任务超时(timeout)的取消相关的知识,希望对你有一定的参考价值。



文章目录


  • 1. 概览
  • 2. Task 超时取消实现之思路
  • 3. 第一种实现
  • 4. 第二种实现
  • 5. 总结


1. 概览

从 Swift 5.5 开始,Apple 引入了新的 async/await 并发模型,我们可以利用它很方便的开发结构化并发代码。

在使用新的并发模型时,一个常见的需求就是任务超时的处理。

我们希望当耗时任务的执行在到达指定时间后自动取消,以免影响用户体验。

在本篇博文中,我们将用两种方法来实现新并发模型中 Task 执行的超时处理。

废话少叙,Let’s Go!!!😉




2. Task 超时取消实现之思路

在 Swift 新 async/await 并发模型中,每个 Task 都会并发执行。所以,要想实现任务超时处理我们只需要同时执行两个任务:


  1. 第一个是需要完成的任务;
  2. 第二个是超时监控任务,用它来监听第一个任务是否已超时,如果是则果断取消它;

有的小伙伴可能觉得实现监控任务有点棘手,其实,这超乎意料的简单!


3. 第一种实现

我们只需保存执行的 Task 对象,然后在超时发生时,在第二个超时监控任务中将其取消即可,代码如下:

struct TimedOutError: Error, Equatable
func execute<R>(timeout: TimeInterval, task: &#64;escaping () async throws -> R) async throws -> R

let task &#61; Task
try await task()


Task
try? await Task.sleep(until: .now &#43; .seconds(timeout), clock: .continuous)
task.cancel()


do
return try await task.value
catch
// 如果任务被取消&#xff0c;则我们知道任务超时了
if task.isCancelled
throw TimedOutError()

throw error


正如之前的实现思路&#xff0c;我们依次创建了两个任务&#xff1a;第一个是需要完成的任务&#xff0c;第二个则是超时监控任务&#xff1b;在第二个任务中&#xff0c;一旦超时到达&#xff0c;则取消第一个任务。

Task
do
let r &#61; try await execute(timeout: 3.0)
// 任务会触发超时&#xff0c;将被取消&#xff01;
try await Task.sleep(until: .now &#43; .seconds(3.1), clock: .continuous)
return 11


print("结果是 \\(r)")
catch
print("ERR: \\(error.localizedDescription)")


不过&#xff0c;这样有两个小问题&#xff1a;


  1. 如果第一个任务在超时前完成&#xff0c;超时监控任务在超时后仍会尝试取消它&#xff1b;
  2. 当任务执行出现异常时&#xff0c;我们需要判断任务是否被取消&#xff0c;然后再抛出 TimedOutError 错误&#xff1b;

虽然&#xff0c;这并不影响整个 execute() 方法的逻辑&#xff0c;但如果小伙伴们是强迫症患者&#xff0c;我们还有第二种方法可以选择。


4. 第二种实现

第二种方法和前者类似&#xff0c;不过这里我们利用了新并发模型中任务组&#xff08;TaskGroup&#xff09;的特点&#xff1a;其中所有子任务都会并发执行&#xff0c;而且我们可以取消所有子任务。

func execute2<R>(timeout: TimeInterval, task: &#64;escaping () async throws -> R) async throws -> R
try await withThrowingTaskGroup(of: R.self) group in
group.addTask
try await task()


group.addTask
try await Task.sleep(until: .now &#43; .seconds(timeout), clock: .continuous)
throw TimedOutError()


let result &#61; try await group.next()!
// 一旦我们取消所有子任务&#xff0c;则超时监控任务不会在正常任务未超时还抛出异常
group.cancelAll()
return result


如上代码所示&#xff0c;用 TaskGroup 来实现任务超时逻辑更加清晰&#xff0c;而且避免了第一种方法中的两个问题。



更多 Task 任务超时的讨论请参考下面的链接&#xff1a;

Running an async task with a timeout




5. 总结

在本篇博文中&#xff0c;我们用两种方法实现了 Swift 新 async/await 并发模型中任务超时的取消&#xff0c;任君选择。

感谢观赏&#xff0c;再会&#xff01;&#x1f60e;


推荐阅读
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • Java多线程实现:从1到100分段求和并汇总结果
    本文介绍如何使用Java编写一个程序,通过10个线程分别计算不同区间的和,并最终汇总所有线程的结果。每个线程负责计算一段连续的整数之和,最后将所有线程的结果相加。 ... [详细]
  • 深入解析Java多线程与并发库的应用:空中网实习生面试题详解
    本文详细探讨了Java多线程与并发库的高级应用,结合空中网在挑选实习生时的面试题目,深入分析了相关技术要点和实现细节。文章通过具体的代码示例展示了如何使用Semaphore和SynchronousQueue来管理线程同步和任务调度。 ... [详细]
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
  • Spring Cloud学习指南:深入理解微服务架构
    本文介绍了微服务架构的基本概念及其在Spring Cloud中的实现。讨论了微服务架构的主要优势,如简化开发和维护、快速启动、灵活的技术栈选择以及按需扩展的能力。同时,也探讨了微服务架构面临的挑战,包括较高的运维要求、分布式系统的复杂性、接口调整的成本等问题。最后,文章提出了实施微服务时应遵循的设计原则。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
author-avatar
淘气小顽童刘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有